package pe.com.cotelasa.scp.controlador;

import java.awt.print.PrinterException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;

import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarMensaje;
import pe.com.cotelasa.helper.GuiaRemisionPrintHelper;
import pe.com.cotelasa.scp.controlador.backingBean.BKListGuiaDeRemision;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.modelo.KardexModel;
import pe.com.cotelasa.scp.dominio.service.IServicioEmpresa;
import pe.com.cotelasa.scp.dominio.service.IServicioGuiaRemision;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioMotivo;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioParametroDetalle;
import pe.com.cotelasa.scp.dominio.servicio.impl.ServicioParametroDetalleImpl;
import pe.com.cotelasa.scp.entidad.DetalleGuiaRemision;
import pe.com.cotelasa.scp.entidad.GuiaRemision;
import pe.com.cotelasa.scp.entidad.Motivo;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.to.GuiaRemisionTO;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;
import pe.com.cotelasa.scp.entidad.Kardex;

@SuppressWarnings({"serial", "unchecked"})
@Named(value = "MBListGuiaDeRemision")
@Scope("request")
public class MBListGuiaDeRemision extends MBGenerico implements Serializable {

    private static Logger logger = Logger.getLogger(MBListGuiaDeRemision.class);
    @Inject
    private BKListGuiaDeRemision bkListGuiaDeRemision;
    @Inject
    private MBGuiaDeRemisionIN mbGuiaDeRemisionIN;
    @Inject
    private MBGuiaDeRemisionOUT mbGuiaDeRemisionOUT;
    @Inject
    private IServicioGuiaRemision servicioGuiaRemision;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioOrdenPedido servicioOrdenPedido;
    @Inject
    private IServicioOrdenCompraServicio servicioOrdenCS;
    @Inject
    private IServicioParametroDetalle servicioParametroDetalle;
    @Inject
    private KardexModel kardexModel;
    @Inject
    private IServicioMotivo servicioMotivo;
    @Inject
    private IServicioKardex servicioKardex;
    @Autowired
    BKSession session;

    public String mostrarMantenimiento() {
        try {
            bkListGuiaDeRemision.setListaTipoGuia(servicioParametro.listarTipoGuiasActivas());
            bkListGuiaDeRemision.setListaMotivoGuia(servicioParametro.listaTipoMotivoGuia());
            OrdenPedido ordenP = new OrdenPedido();
            ordenP.setIdEmpresa(session.getEmpresa());
            bkListGuiaDeRemision.setListaOrdenesPedido(servicioOrdenPedido.listarOrdenesPedidoActivosPorEmpresa(ordenP));
            //bkListGuiaDeRemision.setListaTipoMotivoGuia(servicioParametro.listaTipoMotivoGuia());
            bkListGuiaDeRemision.setEmpresaFormulario(session.getEmpresa());
            bkListGuiaDeRemision.setGuiaBusqueda(new GuiaRemision());
            bkListGuiaDeRemision.getGuiaBusqueda().setIdEmpresa(session.getEmpresa());
            bkListGuiaDeRemision.getGuiaBusqueda().setParametroTipoGuia(new ParametroDetalle(0));
            bkListGuiaDeRemision.getGuiaBusqueda().setIdOrdenCompraServicio(new OrdenCompraServicio(-1));
            bkListGuiaDeRemision.getGuiaBusqueda().setParametroMotivoGuia(new ParametroDetalle(0));
            bkListGuiaDeRemision.getGuiaBusqueda().setNombreDestinatario("");
            bkListGuiaDeRemision.getGuiaBusqueda().setNumeroGuia("");
            bkListGuiaDeRemision.setListaGuiasDeRemision(null);
            bkListGuiaDeRemision.setOrdenPedidoBusqueda(new OrdenPedido(-1));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
    }

    public void buscarListaOrdenComprasServicio() {
        try {
            OrdenCompraServicio orden = new OrdenCompraServicio();

            if (bkListGuiaDeRemision.getOrdenPedidoBusqueda().getId() == -1) {
                bkListGuiaDeRemision.setListaOrdenSC(null);
                bkListGuiaDeRemision.getGuiaBusqueda().setIdOrdenCompraServicio(orden);
                bkListGuiaDeRemision.getGuiaBusqueda().getIdOrdenCompraServicio().setId(-1);
            } else {
                bkListGuiaDeRemision.getOrdenPedidoBusqueda().setIdEmpresa(session.getEmpresa());
                orden.setIdOrdenPedido(bkListGuiaDeRemision.getOrdenPedidoBusqueda());
                orden.setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor());
                orden.setTipo('%');
                String[] listaEsdado = {"" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor(),
                    "" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor()};

                bkListGuiaDeRemision.setListaOrdenSC(servicioOrdenCS.listarOrdenCSConCodigoPorOP(orden, listaEsdado));

            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void buscarListaGuiaRemision() {
        try {

            GuiaRemision guia = bkListGuiaDeRemision.getGuiaBusqueda();

            guia.setOrdenPedido(bkListGuiaDeRemision.getOrdenPedidoBusqueda());

            bkListGuiaDeRemision.setListaGuiasDeRemision(servicioGuiaRemision.obtenerGuiaRemisionBusqueda(guia, bkListGuiaDeRemision.getFechaInicio(), bkListGuiaDeRemision.getFechaFinal()));
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String editar() {
        String URL = new String();
        if (bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getTipo_guia().equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA)) {
            URL = mbGuiaDeRemisionIN.editar();
        } else {
            URL = mbGuiaDeRemisionOUT.editar();
        }
        return URL;
    }

    /*public String imprimir(ActionEvent actionEvent) {
        Integer idGuia = bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getId_guia_remision();
        try {
            GuiaRemision guiaRemision = servicioGuiaRemision.conseguirGuiaDeRemisionPorId(idGuia);
            GuiaRemisionPrintHelper.imprimir(guiaRemision);
        } catch (ServiceException e) {
            e.printStackTrace();
        } catch (PrinterException e) {
            e.printStackTrace();
        }
        return URLPaginacion.GuiasDeRemision.URL_LISTA_GUIA_REMISION;
    }*/

    public void eliminar(ActionEvent actionEvent) {
        GuiaRemisionTO guiaRemisionTO = bkListGuiaDeRemision.getGuiaRemisionTOCurrent();
        try {
            GuiaRemision guiaRemision = servicioGuiaRemision.conseguirGuiaDeRemisionPorId(guiaRemisionTO.getId_guia_remision());
            guiaRemision.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.INACTIVO.getValor()));
            guiaRemision.setUsrModificacion(session.getUsuario().getUsuario());
            guiaRemision.setFecModificacion(new Date());

            for (DetalleGuiaRemision item : guiaRemision.getDetalleGuiaRemisions()) {
                item.setEstadoRegistro(String.valueOf(ESTADO_REGISTRO.INACTIVO.getValor()));
                item.setUsrModificacion(session.getUsuario().getUsuario());
                item.setFecModificacion(new Date());
            }

            servicioGuiaRemision.actualizarGuiaDeRemision(guiaRemision);
            bkListGuiaDeRemision.getListaGuiasDeRemision().remove(guiaRemisionTO);
            mostrarMensaje("Se elimino la Guia de Remision correctamente");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void anular(ActionEvent actionEvent) {
        try {
            System.out.println("emitido : "+bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getEmitioEnable());
            if (bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getEmitioEnable()) {
                Collection<Kardex> listaKardex = new ArrayList<Kardex>();

                try {
                    listaKardex = servicioKardex.buscarKardexPorGuia(bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getId_guia_remision());
                } catch (ServiceException e) {
                    e.printStackTrace();
                }
                try {
                    kardexModel.anularKardex(listaKardex, session.getUsuario().getUsuario());
                } catch (ModelExcepcion e) {
                    e.printStackTrace();
                }
            }

            GuiaRemision guiaRemision = servicioGuiaRemision.conseguirGuiaDeRemisionPorId(bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getId_guia_remision());
            guiaRemision.setEstadoGuia(String.valueOf(GuiaRemision.ESTADO_GUIA_REMISION.ANULADO.getValor()));
            guiaRemision.setUsrModificacion(session.getUsuario().getUsuario());
            guiaRemision.setFecModificacion(new Date());

            servicioGuiaRemision.actualizarGuiaDeRemision(guiaRemision);
            buscarListaGuiaRemision();


            mostrarMensaje("Se anuló la Guía de Remisión correctamente");
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al anular la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void confirmarRecepcion(ActionEvent actionEvent) throws ModelExcepcion {
        try {
            GuiaRemision guiaRemision = servicioGuiaRemision.conseguirGuiaDeRemisionPorId(bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getId_guia_remision());
            guiaRemision.setEstaEntregado((short) 1);
            guiaRemision.setUsrModificacion(session.getUsuario().getUsuario());
            guiaRemision.setFecModificacion(new Date());

            servicioGuiaRemision.actualizarGuiaDeRemision(guiaRemision);

            kardexModel.realizarKardex(guiaRemision, session.getUsuario().getUsuario());

            if (guiaRemision.getParametroMotivoGuia().getValCadena().endsWith("EMPRESA")) {
                GuiaRemision guia = new GuiaRemision();
                guia.setId(guiaRemision.getId());
                guia.setParametroTipoGuia(servicioParametroDetalle.conseguirParametroDetallePorId(Constantes.TipoGuiaRemision.GUIA_ENTRADA));
                guia.setParametroMotivoGuia(guiaRemision.getParametroMotivoGuia());
                kardexModel.realizarKardex(guia, session.getUsuario().getUsuario());
            }
            buscarListaGuiaRemision();
            /*if (guiaRemision.getParametroTipoGuia().getValCadena().equals(Constantes.TipoMovimiento.ENTRADA)) {
             armarArticulosEntrada(guiaRemision);
             } else {
             armarArticulosSalida(guiaRemision);
             }*/

            mostrarMensaje("Se Confirmo la Recepción de la Guía de Remisión");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al procesar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
    
    public void iniciarEdicion(ActionEvent actionEvent) {
        try {
            //String[] guia = ((String) actionEvent.getComponent().getAttributes().get("numero")).split("-");
            bkListGuiaDeRemision.setSerieEditar("");
            bkListGuiaDeRemision.setNumeroEditar("");
            //servicioArticulos.actualizarArticulo(articulo);
        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
    
    
    public void actualizarNumero() {


        try {
            GuiaRemision guiaRemision = servicioGuiaRemision.conseguirGuiaDeRemisionPorId(bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getId_guia_remision());
            guiaRemision.setUsrModificacion(session.getUsuario().getUsuario());
            guiaRemision.setFecModificacion(new Date());
            guiaRemision.setSerie(UtilitarioCadenas.formatoSerieDocumento(Integer.parseInt(bkListGuiaDeRemision.getSerieEditar())));
            guiaRemision.setNumeroGuia(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bkListGuiaDeRemision.getNumeroEditar())));
            servicioGuiaRemision.actualizarGuiaDeRemision(guiaRemision);
            bkListGuiaDeRemision.getGuiaRemisionTOCurrent().setNro_guia(guiaRemision.getSerie()+"-"+guiaRemision.getNumeroGuia());
            
            //servicioArticulos.actualizarArticulo(articulo);
            mostrarMensaje("Se actualizó la Factura satisfactoriamente.");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al eliminar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String ver() {
        String URL = new String();
        if (bkListGuiaDeRemision.getGuiaRemisionTOCurrent().getTipo_guia().equalsIgnoreCase(Constantes.TipoMovimiento.ENTRADA)) {
            URL = mbGuiaDeRemisionIN.ver();
        } else {
            URL = mbGuiaDeRemisionOUT.ver();
        }
        return URL;
    }

    public String buscarTipoGuia(int i) throws ServiceException {
        return servicioParametroDetalle.conseguirParametroDetallePorId(i).getDesParametroDet();
    }

    public void elegirTipoGuia() {
        //return servicioParametroDetalle.conseguirParametroDetallePorId(i).getDesParametroDet();
        try {

            bkListGuiaDeRemision.setListaMotivoGuia(servicioParametro.listaTipoMotivoGuia());

            if (bkListGuiaDeRemision.getGuiaBusqueda().getParametroTipoGuia().getId() != 0) {
                String tipo = "";
                Collection<ParametroDetalle> lista = new ArrayList<ParametroDetalle>();
                if (bkListGuiaDeRemision.getGuiaBusqueda().getParametroTipoGuia().getId() == Constantes.TipoGuiaRemision.GUIA_ENTRADA) {
                    tipo = "ENTRADA";
                } else {
                    tipo = "SALIDA";
                }
                for (ParametroDetalle parametro : bkListGuiaDeRemision.getListaMotivoGuia()) {
                    for (Motivo motivo : servicioMotivo.buscarMotivosPorGrupo(tipo)) {
                        if (motivo.getDeMotivo().equalsIgnoreCase(parametro.getValCadena())) {
                            lista.add(parametro);
                        }
                    }

                }
                bkListGuiaDeRemision.setListaMotivoGuia(lista);

            } else {
                bkListGuiaDeRemision.getGuiaBusqueda().setNombreDestinatario("");
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al procesar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
}
